package shiyan2;

import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;


public class TCPClient {
    public static void main(String[] args) {
        // 服务端IP地址（本地回环地址）
        String host = "127.0.0.1";
        // 服务端监听的端口号
        int port = 8080;
        System.out.println("[Client] 连接到 " + host + ":" + port + " ，输入内容后回车发送；输入 exit 回车退出。");

        // 使用try-with-resources创建Socket及输入输出流，自动关闭资源
        try (// 连接服务端（指定IP和端口）
             Socket socket = new Socket(host, port);
             // 读取控制台输入（用户输入）
             BufferedReader console = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
             // 从Socket获取输入流，用于读取服务端响应（指定UTF-8编码）
             BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream(), StandardCharsets.UTF_8));
             // 从Socket获取输出流，用于向服务端发送数据（指定UTF-8编码）
             BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8))
        ) {
            String line;
            // 循环读取用户输入（控制台输入）
            while ((line = console.readLine()) != null) {
                // 发送用户输入的数据到服务端（需添加换行符，否则服务端readLine()会阻塞）
                out.write(line);
                out.write("\r\n");
                out.flush(); // 强制刷新缓冲区，确保数据立即发送

                // 读取服务端的响应
                String resp = in.readLine();
                // 判断服务端是否关闭连接（响应为null表示连接已关闭）
                if (resp == null) {
                    System.out.println("[Client] 服务端已关闭连接。");
                    break;
                }
                System.out.println("[Client] 收到服务端回复： " + resp);

                // 判断用户是否输入"exit"，若则退出循环（断开连接）
                if ("exit".equalsIgnoreCase(line.trim())) {
                    System.out.println("[Client] 已退出。");
                    break;
                }
            }
        } catch (IOException e) {
            System.out.println("[Client] 连接或通信异常：" + e.getMessage());
        }
    }
}